private subroutine get_set_CH(string, set, separator, maxlen, iostat)
Read from the default unit into a varying string,
with a custom character-string separator
Arguments
Type |
Intent | Optional | Attributes |
|
Name |
|
type(varying_string),
|
intent(out) |
|
|
:: |
string |
|
character(len=*),
|
intent(in) |
|
|
:: |
set |
|
type(varying_string),
|
intent(out), |
optional |
|
:: |
separator |
|
integer,
|
intent(in), |
optional |
|
:: |
maxlen |
|
integer,
|
intent(out), |
optional |
|
:: |
iostat |
|
Variables
Type |
Visibility | Attributes |
|
Name |
| Initial | |
character(len=1),
|
private |
|
:: |
buffer |
|
|
|
integer,
|
private |
|
:: |
i_set |
|
|
|
integer,
|
private |
|
:: |
n_chars_remain |
|
|
|
Source Code
subroutine get_set_CH (string, set, separator, maxlen, iostat)
type(varying_string), intent(out) :: string
character(LEN=*), intent(in) :: set
type(varying_string), intent(out), optional :: separator
integer, intent(in), optional :: maxlen
integer, intent(out), optional :: iostat
integer :: n_chars_remain
character(LEN=1) :: buffer
integer :: i_set
string = ''
if(PRESENT(maxlen)) then
n_chars_remain = maxlen
else
n_chars_remain = HUGE(1)
endif
if(PRESENT(separator)) separator = ''
read_loop : do
if(n_chars_remain <= 0) return
if(PRESENT(iostat)) then
read(*, FMT='(A1)', ADVANCE='NO', IOSTAT=iostat) buffer
if(iostat /= 0) exit read_loop
else
read(*, FMT='(A1)', ADVANCE='NO', EOR=999) buffer
endif
i_set = SCAN(buffer, set)
if(i_set == 1) then
if(PRESENT(separator)) separator = buffer
exit read_loop
endif
string = string//buffer
n_chars_remain = n_chars_remain - 1
end do read_loop
999 continue
! Finish
return
end subroutine get_set_CH